package de.e2it3t.schulverwaltung;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.e2it3t.schulverwaltung.ui.AppFrame;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

/**
 * Statischer Helfer für applikationsspezifische Operationen und Daten.
 *
 * @author Markus Kunz und Viktor Reiser
 */
public class App {

    /**
     * Start der grafischen Anwendung.
     *
     * @param args
     *
     * @see AppFrame
     */
    public static void main(String[] args) {
        try {
            getDatabase();
        } catch (Exception e) {
            JFrame frame = new JFrame();
            JOptionPane.showMessageDialog(
                    frame,
                    "Konnte Datenbankverbidnung nicht herstellen!\n\nMeldung:\n"
                    + e.getCause().getMessage(),
                    "Datenbankverbindung fehlgeschlagen",
                    JOptionPane.ERROR_MESSAGE);
            frame.dispose();
            return;
        }
        
        try {
            getDatabase().hasFaecherMitLehrern();
        } catch (Exception e) {
            JFrame frame = new JFrame();
            JOptionPane.showMessageDialog(
                    frame,
                    "Eine Datenbankverbindung konnte aufgebaut werden, allerdings\n"
                    + "scheint das notwendige Datenbankschema nicht zu exisitieren\n"
                    + "(tables.sql und views.sql)!",
                    "Datenbankschmea nicht vorhanden",
                    JOptionPane.ERROR_MESSAGE);
            frame.dispose();
            return;
        }
        
        if (!getDatabase().hasRaeume()) {
            JFrame frame = new JFrame();
            JOptionPane.showMessageDialog(
                    frame,
                    "Datenbankverbindung konnte aufgebaut werden,\n"
                    + "Datenbankschema scheint auch vorhaden zu sein,\n"
                    + "allerdings fehlen die (Test)Daten (data.sql)!",
                    "Daten nicht vorhanden",
                    JOptionPane.ERROR_MESSAGE);
            frame.dispose();
            return;
        }
        
        AppFrame.showFrame();
    }

    private App() {
    }

    /**
     * Konfiguration der Anwendung.
     *
     * @return Konfiguration
     *
     * @see Config
     */
    public static Config getConfig() {
        return Config.getInstance();
    }

    /**
     * Datenbank der Anwendung.
     *
     * @return Objekt für den Datenbank Zugriff
     *
     * @see Database
     */
    public static Database getDatabase() {
        return Database.getInstance();
    }

    public static void showHelpDialog(String content, int width, int height) {
        final JDialog dialog = new JDialog();

        JLabel help = new JLabel(content);
        help.setPreferredSize(new Dimension(width, height));
        help.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        JButton close = new JButton("Schließen");
        close.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dialog.dispose();
            }
        });

        dialog.setTitle("Hilfe");
        dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        dialog.setModal(true);

        CellConstraints cc = new CellConstraints();

        dialog.setLayout(new FormLayout(
                "5px, fill:pref:grow, 5px",
                "5px, fill:pref:grow, 5px, pref, 5px"));
        dialog.add(help, cc.xy(2, 2));
        dialog.add(close, cc.xy(2, 4));

        dialog.pack();
        dialog.setResizable(false);
        dialog.setLocationRelativeTo(null);
        dialog.setVisible(true);
    }

    public static JButton createInfoButton(final String content, final int width, final int height) {
        JButton info = new JButton("?");
        info.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                App.showHelpDialog(content, width, height);
            }
        });

        return info;
    }
}
